#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <vector>
#include <random>
#include <chrono>

std::mutex mtx;                // 互斥锁，用于保护共享资源
std::condition_variable cv;    // 条件变量，用于线程同步
bool channel_busy = false;     // 信道状态：true表示忙碌，false表示空闲
int collision_count = 0;       // 冲突计数器，用于模拟冲突

// 模拟设备发送数据的函数
void send_data(int id) {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dist(50, 200); // 随机等待或发送时间（毫秒）

    while (true) {
        // 载波侦听：等待信道空闲
        {
            std::unique_lock<std::mutex> lock(mtx);
            cv.wait(lock, [] { return !channel_busy; }); // 阻塞直到信道空闲
            channel_busy = true; // 占用信道
            std::cout << "设备 " << id << " 开始发送数据。\n";
        }

        // 模拟发送数据的时间
        std::this_thread::sleep_for(std::chrono::milliseconds(dist(gen)));

        // 冲突检测
        {
            std::lock_guard<std::mutex> lock(mtx);
            if (collision_count > 0) {
                std::cout << "设备 " << id << " 检测到冲突，停止发送。\n";
                channel_busy = false; // 释放信道
                collision_count--;    // 减少冲突计数
                cv.notify_all();      // 通知其他等待线程
                // 随机退避一段时间后重试
                std::this_thread::sleep_for(std::chrono::milliseconds(dist(gen)));
                continue;
            }
        }

        // 发送成功
        std::cout << "设备 " << id << " 数据发送完成。\n";
        {
            std::lock_guard<std::mutex> lock(mtx);
            channel_busy = false; // 释放信道
            cv.notify_all();      // 通知其他线程
        }
        break; // 发送成功后退出
    }
}

int main() {
    const int num_devices = 5; // 模拟5个设备
    std::vector<std::thread> threads;

    // 创建多个线程模拟设备
    for (int i = 0; i < num_devices; ++i) {
        threads.emplace_back(send_data, i);
    }

    // 主线程模拟冲突场景
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    {
        std::lock_guard<std::mutex> lock(mtx);
        collision_count = 2; // 模拟2个设备发生冲突
        std::cout << "主线程注入冲突，冲突计数 = " << collision_count << "。\n";
    }

    // 等待所有线程完成
    for (auto& t : threads) {
        t.join();
    }

    std::cout << "所有设备发送完成。\n";
    return 0;
}